/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tomasio.projects.welcome.dao;

import com.tomasio.projects.organization.webservices.EfetivoWS;
import com.tomasio.projects.organization.webservices.EfetivoWSService;
import com.tomasio.projects.organization.webservices.EmailDTO;
import com.tomasio.projects.organization.webservices.FotoDTO;
import com.tomasio.projects.organization.webservices.TelefoneDTO;
import com.tomasio.projects.welcome.dto.AutorizacaoDeAcessoDTO;

import com.tomasio.projects.welcome.dto.PessoaDTO;
import com.tomasio.projects.welcome.dto.ProibicaoDeAcessoDTO;
import com.tomasio.projects.welcome.model.AutorizacaoDeAcesso;
import com.tomasio.projects.welcome.model.Email;
import com.tomasio.projects.welcome.model.Foto;
import com.tomasio.projects.welcome.model.Identidade;
import com.tomasio.projects.welcome.model.Pessoa;
import com.tomasio.projects.welcome.model.ProibicaoDeAcesso;
import com.tomasio.projects.welcome.model.Telefone;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.rowset.serial.SerialBlob;
import javax.sql.rowset.serial.SerialException;

/**
 *
 * @author administrador
 */
public class SOAPPessoaDAO implements PessoaDAO {

    private static Long GAPID = 50000L;

    @Override
    public PessoaDTO find(Long id) {
        Long _id = id - GAPID;
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa = port.findPessoa(_id);
        PessoaDTO pessoa = convertPessoa(wsPessoa).createDTO();
        return pessoa;
    }

    @Override
    public long create(PessoaDTO pessoa) {
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        com.tomasio.projects.organization.webservices.PessoaDTO pessoaWS =
                new com.tomasio.projects.organization.webservices.PessoaDTO();
        pessoaWS.setCpf(pessoa.getCpf());
        pessoaWS.setNome(pessoa.getNome());
        
        return port.createPessoa(pessoaWS) + GAPID;
        
    }

    @Override
    public void remove(Long id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public long update(PessoaDTO pessoa) {
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();

        com.tomasio.projects.organization.webservices.PessoaDTO pessoaWS =
                port.findPessoa(pessoa.getId() - GAPID);
        //pessoaWS.setCpf(pessoa.getCpf());
        pessoaWS.setNome(pessoa.getNome());

        return port.updatePessoa(pessoaWS) + GAPID;
    }

    @Override
    public List<PessoaDTO> findAll() {

        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        List<com.tomasio.projects.organization.webservices.PessoaDTO> wsPessoas = port.findAllPessoas();
        List<PessoaDTO> pessoas = new ArrayList<PessoaDTO>();
        for (com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa : wsPessoas) {
            pessoas.add(convertPessoa(wsPessoa).createDTO());
        }
        return pessoas;
    }

    @Override
    public List<PessoaDTO> searchByName(String searchTerm) {
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        List<PessoaDTO> pessoas = new ArrayList<PessoaDTO>();
        List<com.tomasio.projects.organization.webservices.PessoaDTO> wsPessoas = port.searchPessoaByName(searchTerm);
        for (com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa : wsPessoas) {
            pessoas.add(convertPessoa(wsPessoa).createDTO());
        }
        return pessoas;
    }

    @Override
    public List<PessoaDTO> searchByIdentidade(String searchTerm) {
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        List<PessoaDTO> pessoas = new ArrayList<PessoaDTO>();
        List<com.tomasio.projects.organization.webservices.PessoaDTO> wsPessoas = port.searchPessoaByIdentidade(searchTerm);
        for (com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa : wsPessoas) {
            pessoas.add(convertPessoa(wsPessoa).createDTO());
        }
        return pessoas;
    }

    @Override
    public List<PessoaDTO> searchByCPF(String searchTerm) {
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        List<PessoaDTO> pessoas = new ArrayList<PessoaDTO>();
        List<com.tomasio.projects.organization.webservices.PessoaDTO> wsPessoas = port.searchPessoaByCPF(searchTerm);
        for (com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa : wsPessoas) {
            pessoas.add(convertPessoa(wsPessoa).createDTO());
        }
        return pessoas;

    }

    @Override
    public PessoaDTO findByCPF(String cpf) {
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa = port.findPessoaByCPF(cpf);
        return convertPessoa(wsPessoa).createDTO();

    }

    @Override
    public PessoaDTO findByIdentidade(String numero, String orgaoExp) {
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa = port.findPessoaByIdentidade(numero, orgaoExp);
        return convertPessoa(wsPessoa).createDTO();

    }

    private Pessoa convertPessoa(com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa) {
        AutorizacaoDeAcessoDAO autorizacaoDAO = new HibernateAutorizacaoDeAcessoDAO();
        ProibicaoDeAcessoDAO proibicaoDAO = new HibernateProibicaoDeAcessoDAO();
        if (wsPessoa != null) {
            Pessoa pessoa = new Pessoa();
            pessoa.setId(wsPessoa.getId() + GAPID);
            pessoa.setCpf(wsPessoa.getCpf());
            pessoa.setNome(wsPessoa.getNome());
            pessoa.setNomeGuerra(wsPessoa.getNomeGuerra());



            Identidade identidade = new Identidade();


            if (wsPessoa.getIdentidade() != null) {
                //identidade.setDataExpedicao(wsPessoa.getIdentidade().getDataExpedicao());
                identidade.setNumero(wsPessoa.getIdentidade().getNumero());
                identidade.setOrgaoExpedidor(wsPessoa.getIdentidade().getOrgaoExpedidor());
            }

            Set<Foto> fotos =
                    new HashSet<Foto>();

            for (FotoDTO wsFoto : wsPessoa.getFotos()) {
                Foto foto = new Foto();
                try {
                    foto.setSource(new SerialBlob(wsFoto.getSource()));
                } catch (SerialException ex) {
                    Logger.getLogger(SOAPPessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
                } catch (SQLException ex) {
                    Logger.getLogger(SOAPPessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
                fotos.add(foto);
            }

            Set<Telefone> telefones = new HashSet<Telefone>();

            for (TelefoneDTO wsTelefone : wsPessoa.getTelefones()){
                Telefone telefone = new Telefone();
                telefone.setDdd(wsTelefone.getDdd());
                telefone.setLabel(wsTelefone.getLabel());
                telefone.setNumero(wsTelefone.getNumero());
                telefone.setPrivativo(wsTelefone.isPrivativo());
                telefone.setRamal(wsTelefone.getRamal());
                telefones.add(telefone);
            }

            Set<Email> emails = new HashSet<Email>();

            for (EmailDTO wsEmail : wsPessoa.getEmails()){
                Email email = new Email();
                email.setAddress(wsEmail.getAddress());
                emails.add(email);
            }

            pessoa.setEmails(emails);
            pessoa.setTelefones(telefones);
            pessoa.setFotos(fotos);
            pessoa.setIdentidade(identidade);
            
            for (AutorizacaoDeAcessoDTO autorizacao : autorizacaoDAO.findAll(pessoa.getId())) {
                pessoa.addAutorizacaoDeAcesso(AutorizacaoDeAcesso.instantiate(autorizacao));
            }
            for (ProibicaoDeAcessoDTO proibicao : proibicaoDAO.findAll(pessoa.getId())) {
                pessoa.addProibicaoDeAcesso(new ProibicaoDeAcesso(proibicao));
            }

            return pessoa;
        } else {
            return null;
        }

    }

    @Override
    public List<PessoaDTO> searchByNameWithFotos(String searchTerm) {
        EfetivoWSService service = new EfetivoWSService();
        EfetivoWS port = service.getEfetivoWSPort();
        List<PessoaDTO> pessoas = new ArrayList<PessoaDTO>();
        List<com.tomasio.projects.organization.webservices.PessoaDTO> wsPessoas = port.searchPessoaByNameWithFotos(searchTerm);
        for (com.tomasio.projects.organization.webservices.PessoaDTO wsPessoa : wsPessoas) {
            pessoas.add(convertPessoa(wsPessoa).createDTO());
        }
        return pessoas;
    }
}
